package com.example.erat.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * 数据库初始化器
 * 
 * 此组件用于在应用启动时验证数据库连接和表的存在性
 * 质量属性关联：
 * - 可靠性：确保数据库连接的可靠性
 * - 可维护性：提供启动时的数据库诊断信息
 */
@Slf4j
@Component
public class DbInitializer implements CommandLineRunner {

    private final JdbcTemplate jdbcTemplate;

    // 需要验证的表列表
    private final List<String> requiredTables = Arrays.asList(
            "class_info", "student", "course", "experiment", "experiment_submission");

    @Autowired
    public DbInitializer(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void run(String... args) {
        log.info("数据库初始化器启动");
        try {
            // 测试数据库连接
            String dbVersion = jdbcTemplate.queryForObject("SELECT VERSION()", String.class);
            log.info("成功连接到MySQL数据库，版本: {}", dbVersion);
            
            // 验证表是否存在
            validateTables();
            
        } catch (Exception e) {
            log.error("数据库初始化失败", e);
        }
    }
    
    /**
     * 验证所需表是否存在
     */
    private void validateTables() {
        log.info("开始验证数据库表...");
        
        try {
            // 获取当前数据库中的所有表
            List<String> existingTables = jdbcTemplate.queryForList(
                    "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = (SELECT DATABASE())",
                    String.class);
            
            boolean allTablesExist = true;
            
            // 检查每个必需的表是否存在
            for (String table : requiredTables) {
                boolean tableExists = existingTables.stream()
                        .anyMatch(t -> t.equalsIgnoreCase(table));
                
                if (tableExists) {
                    log.info("表 {} 已存在", table);
                    
                    // 可选：检查表中是否有数据
                    int rowCount = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM " + table, Integer.class);
                    log.info("表 {} 中有 {} 条记录", table, rowCount);
                    
                } else {
                    log.warn("表 {} 不存在！", table);
                    allTablesExist = false;
                }
            }
            
            if (allTablesExist) {
                log.info("所有必需的表都已存在，数据库验证成功");
            } else {
                log.warn("部分必需的表不存在，请确保数据库已正确初始化");
            }
            
        } catch (Exception e) {
            log.error("验证数据库表失败", e);
        }
    }
} 